package cn.sjxy.regi.service.impl;

import cn.sjxy.regi.mapper.ShoppingCartMapper;
import cn.sjxy.regi.pojo.ShoppingCart;
import cn.sjxy.regi.service.ShoppingCartService;
import cn.sjxy.regi.utils.BaseContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
 * ClassName:ShoppingCartServiceImpl
 * Package:cn.sjxy.regi.service.impl
 * Description:
 *
 * @Date:2022/6/25 17:56
 * @Author:SXW
 */
@Service
public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, ShoppingCart> implements ShoppingCartService {

    @Override
    public ShoppingCart add(ShoppingCart shoppingCart) {
        // 获取当前用户的 id
        Long currentId = BaseContext.getCurrentId(); // 自己封装的工具类，获取当前操作的用户 id
        // 将当前操作用户的 id 设置到 当前购物车中
        shoppingCart.setUserId(currentId);

        // 添加购物车无需每次都在表中插入一条数据
        // 1. 查询当前商品是否已经在购物车中存在，存在则修改数量，不在则插入，数量默认为1
        Long dishId = shoppingCart.getDishId();

        // 构建条件查询商品信息
        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 以当前用户 id 查询
        shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, currentId);

        // 判断添加的是菜品还是套餐，动态的拼接查询条件
        if (dishId != null) { // 添加的是菜品
            // 根据购物车表中的 Dish_id 查询
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getDishId, dishId);
        } else { // 添加的是套餐
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
        }
        // 获取到一个确定的对象
        ShoppingCart cart4DB = this.getOne(shoppingCartLambdaQueryWrapper);

        // 判断是否为新增商品
        if (cart4DB != null) { // 不为空，即存在
            // 存在则获取原有的数量，然后加 1
            Integer number = cart4DB.getNumber();
            cart4DB.setNumber(number + 1);
            this.updateById(cart4DB);
        } else { // 为空，即为新增商品
            // 不存在则直接插入一条数据，默认 number 是 1
            shoppingCart.setNumber(1);
            // 存储前，设置新增时间
            shoppingCart.setCreateTime(LocalDateTime.now());
            // 保存到数据库
            this.save(shoppingCart);
            // 因为数据库中没有该对象，新增对象中只有设置过的值
            cart4DB = shoppingCart; // 统一返回的对象
        }
        return cart4DB;
    }

    @Override
    public ShoppingCart sub(ShoppingCart shoppingCart) {
        // 获取当前操作的购物车
        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());

        Long dishId = shoppingCart.getDishId();
        if (dishId != null) { // 传回的是菜品
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getDishId, dishId);
        } else { // 传回的是套餐
            shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
        }
        ShoppingCart cart = this.getOne(shoppingCartLambdaQueryWrapper);
        Integer number = cart.getNumber();
        cart.setNumber(number - 1);
        this.updateById(cart);
        // 当少于 1 份时，将该条数据从数据库中移出
        if (number < 2) {
            this.removeById(cart.getId());
        }
        return cart;
    }

    /**
     * 删除当前用户下，购物车中所有数据
     */
    @Override
    public void clearShoppingCart() {
        // 删除当前用户下的所有购物车信息
        List<ShoppingCart> carts = getCart();
        List<Long> ids = carts.stream().map(item -> {
            Long id = item.getId();
            return id;
        }).collect(Collectors.toList());
        this.removeByIds(ids);
    }


    /**
     * 获取当前用户下的所有购物车信息
     *
     * @return
     */
    @Override
    public List<ShoppingCart> getCart() {
        LambdaQueryWrapper<ShoppingCart> shoppingCartLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 根据 user_id 查询购物车
        shoppingCartLambdaQueryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        shoppingCartLambdaQueryWrapper.orderByDesc(ShoppingCart::getCreateTime);
        List<ShoppingCart> carts = this.list(shoppingCartLambdaQueryWrapper);
        return carts;
    }
}
